perm filename RCBDYN[HAL,HE] blob
sn#117123 filedate 1974-08-25 generic text, type T, neo UTF8
.NEWSS (MOVING ASSEMBLY LINES,ASSEMBLY LINES)
The initial system does not include the ability to specify
that a frame (eg. a conveyor belt) is continually moving in some
predictable way. However, consider the following segment of
hypothetical HAL code which will hopefully make this addition
plausible. The basic idea is to invent dynamic variables and frames
which can be predicted at compile-time and monitored at runtime.
Anything attached to a dynamic frame automatically moves along with
it. When the arm moves to a frame attached to a dynamic
frame, the planner uses a `predicting function' to estimate where the
destination frame should be and the servo continually monitors the
dynamic variables, invokes the relevant calculators, and updates the
destination accordingly.
Here is an example in a hypothetical extended HAL:
.UNFILL
.APART
SCALAR TIME_OF_LOCATION;
ASSERT TIME_OF_LOCATION = 0;
FRAME PUMP_BASE, PUMP_GRASP, X;
PUMP_BASE ← [ ... ];
.COMT 16
COMMENT this is an estimate of where the vision routine
is going to locate the PUMP_BASE;
.end
PUMP_GRASP ← PUMP_BASE * [ ... ];
DYNAMIC_FRAME CONVEYOR;
.COMT 16
COMMENT when the conveyor is added to the system,
a reserved word LINEAR_TRAVEL_OF_THE_CONVEYOR would
have to be added to the syntax and the servo would
have to be told what to monitor through the A-to-D
in order to determine its value. This variable could
then be used in the calculator expressions for any
DYNAMIC_FRAME. The next statement asserts a scalar
function which can be used by the compiler to predict
the value of LINEAR_TRAVEL_OF_THE_CONVEYOR, given
a starting value (eg. START_C) and a time duration
(eg. DELTA_T);
.end
ASSERT LINEAR_TRAVEL_OF_THE_CONVEYOR = (START_C + 7.3*DELTA_T);
.COMT 16
COMMENT the next statement sets up the necessary calculator
within the graph structure;
.end
CONVEYOR <= [(-10, 0, 0):(0, 0, 0)] +
(0, LINEAR_TRAVEL_OF_THE_CONVEYOR, 0);
VISUALLY_LOCATE(PUMP_BASE, TIME_OF_LOCATION);
.COMT 16
COMMENT this is procedure which uses vision to set the
value of the FRAME PUMP_BASE and set the TIME_OF_LOCATION
so the servo can determine the DELTA_T needed to correct
for the conveyor's movement;
.end
ATTACH PUMP_BASE TO CONVEYOR AT TIME_OF_LOCATION;
.COMT 16
COMMENT this attaches the PUMP_BASE to the CONVEYOR at the
indicated time. The servo can adjust accordingly;
.end
MOVE YELLOW TO PUMP_GRASP;
.COMT 16
COMMENT the planner estimates what the value of
LINEAR_TRAVEL_OF_THE_CONVEYOR would be, predicts where
PUMP_GRASP would be (and how long it would take to get there)
and plans a trajectory to get to the predicted destination.
At runtime the servo monitors the actual changes of
LINEAR_TRAVEL_OF_THE_CONVEYOR and adjusts accordingly.
Upon reaching the destination, the arm continues to track
the object along the conveyor until a MOVE is made to
some frame not attached to the conveyor;
.end
ASSERT TIME(CENTER) = 100;
CENTER YELLOW;
.COMT 16
COMMENT since the time to execute a CENTER varies depending
upon the relative position of the object and the distance
between the fingers, the planner has to be given an estimate
of how long this is expected to take, so it can predict
the PUMP_BASE's movement along the conveyor;
.end
DETACH PUMP_BASE FROM CONVEYOR;
ATTACH PUMP_BASE TO YELLOW;
.COMT 16
COMMENT notice that the arm has still not moved away from
the dynamic frame; hence it is still tracking;.
.end
MOVE PUMP_BASE TO X;
.COMT 16
COMMENT this finally breaks the dynamic bond between the arm
and the conveyor;
.end
.REFILL